import { httpPost } from "@/appBase/request";
import { toData } from "@/appBase/utils";
import config from '@/config/index';
// import notification from 'ant-design-vue/es/notification';
import { notification } from 'ant-design-vue';
import axios from 'axios';

const instance = axios.create({
    timeout: 1000 * 60 * 60 * 24,
    // baseURL: '/apis',    
    headers: {
        'Content-Type': 'multipart/form-data'
    },
    withCredentials: false
});

export const BizTypeEnum = {
    /** 帖子图片 */
    IMAGE_POST: 100001,
    /** 活动图片 */
    IMAGE_ACTIVITY: 100002,
    /** 帖子视频 */
    VIDEO_POST: 200001,
    /** 举报图片 */
    IMAGE_POST_REPORT: 100004,
    /** 圈子图片 */
    IMAGE_MOMENTS_INFO: 100005,
    /** 圈子帖子置顶图片(前端不用传输,后端自行维护) */
    IMAGE_MOMENTS_POST: 100006,
    /**医生贴子图片 */
    DOCTOR_IMAGE_POST: 101001,
    /**医生贴子视频 */
    DOCTOR_VIDEO_POST: 201001,
    /** 医生白大褂头像 */
    IMAGE_DOCTOR_HEAD: 100011,
    /** 医生个人头像 */
    IMAGE_DOCTOR_PERSONAL_HEAD: 100012,
    /** 医生头像扩展图片信息 */
    IMAGE_DOCTOR_HEAD_AUTH_EXT: 100013,
    /** 医生荣誉头衔-正面 */
    IMAGE_DOCTOR_HONOR_POSITIVE: 100014,
    /** 医生荣誉头衔-反面 */
    IMAGE_DOCTOR_HONOR_REVERSE: 100015,
    /** 医生荣誉头衔-扩展图片 */
    IMAGE_DOCTOR_HONOR_EXT: 100016,
    /** 医生身份证-正面 */
    IMAGE_DOCTOR_ID_CARD_POSITIVE: 100017,
    /** 医生身份证-反面 */
    IMAGE_DOCTOR_ID_CARD_REVERSE: 100018,
    /** 医生身份证-扩展图片 */
    IMAGE_DOCTOR_ID_CARD_EXT: 100019,
    /** 医生职级-正面 */
    IMAGE_DOCTOR_LEVEL_POSITIVE: 100020,
    /** 医生职级-反面 */
    IMAGE_DOCTOR_LEVEL_REVERSE: 100021,
    /** 医生职级-扩展图片 */
    IMAGE_DOCTOR_LEVEL_EXT: 100022,
    /** 医生执业证书-正面 */
    IMAGE_DOCTOR_PROFESSIONAL_POSITIVE: 100023,
    /** 医生执业证书-反面 */
    IMAGE_DOCTOR_PROFESSIONAL_REVERSE: 100024,
    /** 医生执业证书-扩展图片 */
    IMAGE_DOCTOR_PROFESSIONAL_EXT: 100025,
    /** 医生资格证书-正面 */
    IMAGE_DOCTOR_QUALIFICATION_POSITIVE: 100026,
    /** 医生资格证书-反面 */
    IMAGE_DOCTOR_QUALIFICATION_REVERSE: 100027,
    /** 医生资格证书-扩展图片 */
    IMAGE_DOCTOR_QUALIFICATION_EXT: 100028,
    /** 医生职称-正面 */
    IMAGE_DOCTOR_TITLE_POSITIVE: 100029,
    /** 医生职称-反面 */
    IMAGE_DOCTOR_TITLE_REVERSE: 100030,
    /** 医生职称-扩展图片 */
    IMAGE_DOCTOR_TITLE_EXT: 100031,
    /** 系统内容配置 */
    IMAGE_SYS_CONTENT: 100032,
    /** 系统内容分类 */
    IMAGE_SYS_CONTENT_CATEGORY: 100033,
    /** 医院科室 */
    IMAGE_SYS_DEPARTMENT_LOGO: 100034,
    /** 医院科室其他图片 */
    IMAGE_SYS_DEPARTMENT_EXT: 100035,
    /** 系统文件 */
    IMAGE_SYS_FILE: 100036,
    /** 医院LOGO */
    IMAGE_SYS_HOSPITAL_LOGO: 100037,
    /** 医院图片 */
    IMAGE_SYS_HOSPITAL: 100038,
    /** 医院名称图片 */
    IMAGE_SYS_HOSPITAL_NAME: 100039,
    /** 患者头像 */
    IMAGE_USER_HEAD: 100040,
    /** 就诊人头像 */
    IMAGE_INQUIRER: 100041,
    /** 就诊人描述 */
    IMAGE_INQUIRER_DESCRIPTION: 100042,
    /** 电子病历档案 */
    IMAGE_USER_MEDICAL_RECORDS: 100043,
    /**IM消息图片 */
    IMAGE_IM_MSG: 100045,
    /**IM消息音频 */
    AUDIO_IM_MSG: 300001,
    /**预约单图片 */
    IMAGE_REGISTRATION_ORDER: 100046,
    /**权益卡申请图片 */
    CARD_APPLY_MESSAGE: 100052,
    /**权益卡回复图片 */
    CARD_REPLY_MESSAGE: 100053,
    /**医生头图（工作室图片） */
    DOCTOR_WEBSITE_BANNER: 100055,
    /**医生工作室二维码 */
    DOCTOR_OFFICE_QR: 100056,
    /**六方人员头像 */
    TECHNICAL_PERSONNEL_HEAD: 100057,
}

/**
 * 上传文件鉴权
 * @param {Object} params 
 * @param {boolean} params.isPrivate 是否私有
 */
function postUploadAuth(params) {
    let t = new Date().getTime() + '';
    t = t + parseInt(Math.random()) * 10;
    return httpPost(`/oss/auth?_t=${t}`, {
        "bizType": params.bizType,
        "originalName": params.originalName,
        "duration": params.duration,
        "privateStatus": params.isPrivate ? 1 : -1,
    }).then((result) => toData(result));
}

function showLoading(params) {
    // 当前不用实现  
}

function hideLoading(params) {
    // 当前不用实现  
}

function zsAlert(params) {
    notification['warning']({
        message: '提示',
        description: params,
        duration: 4
    });
}


/**
 * 上传文件
 * @param {Object} fileObj
 * @param {String} fileObj.path? 文件路径(患者端小程序必传)
 * @param {String} fileObj.data? 文件数据(PC 环境必传) 支持File对象、Blob数据以及OSS Buffer,base64数据。
 * @param {Number} fileObj.bizType
 * @param {Number} fileObj.duration? 音|视频时长（单位：秒）音视频必传
 * @param {String} fileObj.name? 文件名称(PC 环境必传)
 * @param {boolean} fileObj.isPrivate? 是否为私有文件
 * @param {Array<String>} fileObj.hasLoading?
 */
// export function uploadFile(fileObj) {
//     return new Promise((resolve, reject) => {
//         if (fileObj.hasLoading!=false){
//             showLoading({
//                 title: '传输中...',
//                 mask: true
//             });
//         }
//         if (!fileObj.name) {
//             const arr = fileObj.path.split('/');
//             fileObj.name = arr[arr.length - 1];
//         }
//         // 上传数据为 base64字符串时,转换为Blob数据
//         if (typeof fileObj.data =='string') {
//             fileObj.data = dataURLtoBlob(fileObj.data);
//         }

//         // let isVideo = ['.mp4','.mov','.m4v','.3gp','.avi','.m3u8','.webm'].filter(item=>fileObj.path.lastIndexOf(item)>-1);
//         // isVideo = isVideo.length>0?true:false;
//         // let isAudio = ['.flac','.m4a','.ogg','.ape','.amr','.wma','.wav','.mp3','.aac','.aiff','.caf'].filter(item=>fileObj.path.lastIndexOf(item)>-1);
//         // isAudio = isAudio.length>0?true:false;
//         postUploadAuth({
//             bizType: fileObj.bizType,
//             originalName: fileObj.name,
//             duration: fileObj.duration||0,
//             isPrivate: fileObj.isPrivate
//         }).then((result) => {
//             // 文件大小检测
//             return new Promise((resolve1, reject1) => {
//                 const size = fileObj.data.size;
//                 if (size) {
//                     console.log('上传的文件大小:',size);
//                     if (result.fileMaxSize<size) {
//                         zsAlert(`文件大小超过最大限制${(result.fileMaxSize/1024/1024)}MB，请修改后再试！`);
//                         reject1('break');
//                     }else{
//                         resolve1(result);
//                     }
//                 }
//             });
//         }).then((result) => {
//             const formData = {
//                 key: result.filePath,
//                 policy: result.policy,
//                 OSSAccessKeyId: result.accessId,
//                 signature: result.signature,
//                 callback: result.callback,
//                 // H5额外的参数
//                 'x:id':result.fileId||null,
//                 'x:desc':'文件',
//                 'x:origin_name':fileObj.name,
//                 'success_action_status': '200',
//             }
//             // 创建FormData对象
//             const data = Object.keys(formData).reduce((res,key)=>{
//                 res.append(key, formData[key]);
//                 return res;
//             },new FormData());
//             data.append('name', fileObj.name);
//             // 将得到的文件流添加到FormData对象
//             data.append('file', fileObj.data,fileObj.name);
//             console.log('上传鉴权通过',result);
//             return instance.request({ 
//                 url: result.host, 
//                 method: 'post', 
//                 data
//             }).then((res) => {
//                 if (res.status != 200) {
//                     throw res;
//                 }
//                 return {
//                     id: result.fileId,
//                     path: result.host + '/' + result.filePath,
//                     relativePath: result.filePath
//                 };
//             })
//         }).then((res) => {
//             if (fileObj.hasLoading!=false) hideLoading();
//             resolve(res);
//         }).catch((err) =>{
//             if (fileObj.hasLoading!=false) hideLoading();
//             if (err.message&&err.message.indexOf('timeout') > -1) {
//                 notification.error({
//                     message: '错误',
//                     description: '网络超时！请稍候再试'
//                 });
//                 reject('break');
//             }else{
//                 console.log(err);
//                 // notification.error({
//                 //     message: '错误',
//                 //     description: '上传失败！请稍候再试'
//                 // });
//                 reject(err);
//             }
//         });
//     });
// }


/**
 * 上传文件
 * 修改移除了权限校验、大小校验
 * @param {Object} fileObj
 */
export function uploadFile(fileObj) {
    return new Promise((resolve, reject) => {
        // 将得到的文件流添加到FormData对象
        const data = new FormData();
        data.append('file', fileObj.file)
        // 添加上传文件资源类型 
        data.append('resourceBizType',fileObj.resourceBizType);
        return instance.request({
            url: 'http://116.63.165.177:9006/common/files-upload',
            method: 'post',
            data
        }).then((res) => {
            if (res.status != 200) {
                throw res;
            }
            resolve(res);
        }).catch((err) => {
            if (err.message && err.message.indexOf('timeout') > -1) {
                notification.error({
                    message: '错误',
                    description: '网络超时！请稍候再试'
                });
                reject('break');
            } else {
                console.log(err);
                // notification.error({
                //     message: '错误',
                //     description: '上传失败！请稍候再试'
                // });
                reject(err);
            }
        });


        // let isVideo = ['.mp4','.mov','.m4v','.3gp','.avi','.m3u8','.webm'].filter(item=>fileObj.path.lastIndexOf(item)>-1);
        // isVideo = isVideo.length>0?true:false;
        // let isAudio = ['.flac','.m4a','.ogg','.ape','.amr','.wma','.wav','.mp3','.aac','.aiff','.caf'].filter(item=>fileObj.path.lastIndexOf(item)>-1);
        // isAudio = isAudio.length>0?true:false;
        // postUploadAuth({
        //     bizType: fileObj.bizType,
        //     originalName: fileObj.name,
        //     duration: fileObj.duration||0,
        //     isPrivate: fileObj.isPrivate
        // }).then((result) => {
        //     // 文件大小检测
        //     return new Promise((resolve1, reject1) => {
        //         const size = fileObj.data.size;
        //         if (size) {
        //             console.log('上传的文件大小:',size);
        //             if (result.fileMaxSize<size) {
        //                 zsAlert(`文件大小超过最大限制${(result.fileMaxSize/1024/1024)}MB，请修改后再试！`);
        //                 reject1('break');
        //             }else{
        //                 resolve1(result);
        //             }
        //         }
        //     });
        // }).then((result) => {
        //     const formData = {
        //         key: result.filePath,
        //         policy: result.policy,
        //         OSSAccessKeyId: result.accessId,
        //         signature: result.signature,
        //         callback: result.callback,
        //         // H5额外的参数
        //         'x:id':result.fileId||null,
        //         'x:desc':'文件',
        //         'x:origin_name':fileObj.name,
        //         'success_action_status': '200',
        //     }
        //     // 创建FormData对象
        //     const data = Object.keys(formData).reduce((res,key)=>{
        //         res.append(key, formData[key]);
        //         return res;
        //     },new FormData());
        //     data.append('name', fileObj.name);
        //     // 将得到的文件流添加到FormData对象
        //     data.append('file', fileObj.data,fileObj.name);
        //     // console.log('上传鉴权通过',result);
        //     return instance.request({ 
        //         url: result.host, 
        //         method: 'post', 
        //         data
        //     }).then((res) => {
        //         if (res.status != 200) {
        //             throw res;
        //         }
        //         return {
        //             id: result.fileId,
        //             path: result.host + '/' + result.filePath,
        //             relativePath: result.filePath
        //         };
        //     })
        // }).then((res) => {
        //     if (fileObj.hasLoading!=false) hideLoading();
        //     resolve(res);
        // }).catch((err) =>{
        //     if (fileObj.hasLoading!=false) hideLoading();
        //     if (err.message&&err.message.indexOf('timeout') > -1) {
        //         notification.error({
        //             message: '错误',
        //             description: '网络超时！请稍候再试'
        //         });
        //         reject('break');
        //     }else{
        //         console.log(err);
        //         // notification.error({
        //         //     message: '错误',
        //         //     description: '上传失败！请稍候再试'
        //         // });
        //         reject(err);
        //     }
        // });
    });
}

/**
 * 批量上传文件
 * @param {Array<Object>} fileList 待上传文件列表
 * @param {Object} options? 配置
 * @param {Boolean} options.hasLoading? 是否显示 loading
 * @param {Number} options.bizType? 文件所属业务类型(若各文件单独设置则优先使用各文件设置)
 * fileList:[{path,bizType?,name?,data}]
 * @desc [{path,bizType,name?}]
 */
export function uploadFiles(fileList, options) {
    if (!options) options = { hasLoading: true };
    if (options.hasLoading != false) showLoading({
        title: '传输中...',
        mask: true
    });
    const arr = fileList.map(item => {
        item.hasLoading = false;
        if (!item.bizType) item.bizType = options.bizType;
        return uploadFile(item)
    });
    return Promise.all(arr).then((result) => {
        if (options.hasLoading != false) hideLoading();
        return result;
    }).catch((err) => {
        if (options.hasLoading != false) hideLoading();
        throw err;
    });
}

/**
 * dataURL to blob
 * @param {String} dataurl 
 * @returns
 */
function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], { type: mime });
}

/**
 * blob to dataURL
 * @param {*} blob 
 * @param {*} callback 
 */
function blobToDataURL(blob, callback) {
    var a = new FileReader();
    a.onload = function (e) { callback(e.target.result); };
    a.readAsDataURL(blob);
}

/**
 *  检测文件类型 (根据文件链接)
 * @param {String} path 
 * @author XC
 * @returns 
 */
export function testFileType(path = '') {

    const isImage = [".gif", ".jpeg", ".png", ".webp", ".jpg"].find(i => path.lastIndexOf(i) > -1) ? true : false;
    const isVideo = ['.mp4', '.mov', '.m4v', '.3gp', '.avi', '.m3u8', '.webm', '.ogg'].find(item => path.lastIndexOf(item) > -1) ? true : false;
    const isAudio = ['.flac', '.m4a', '.ogg', '.ape', '.amr', '.wma', '.wav', '.mp3', '.aac', '.aiff', '.caf'].find(item => path.lastIndexOf(item) > -1) ? true : false;
    const isTxt = ['.txt'].find(item => path.lastIndexOf(item) > -1) ? true : false;
    const isExcel = ['.xls', '.xlsx'].find(item => path.lastIndexOf(item) > -1) ? true : false;
    const isWord = ['.doc', '.docx'].find(item => path.lastIndexOf(item) > -1) ? true : false;
    const isPDF = ['.pdf'].find(item => path.lastIndexOf(item) > -1) ? true : false;
    const isPPT = ['.ppt', '.pptx'].find(item => path.lastIndexOf(item) > -1) ? true : false;
    const canPlay = isImage || ['.mp4', '.m3u8', '.ogg', '.mp3'].find(item => path.lastIndexOf(item) > -1) ? true : false;
    return {
        isImage,
        isVideo,
        isAudio,
        isTxt,
        isExcel,
        isWord,
        isPDF,
        isPPT,
        canPlay
    }
}